package com.xiaoniu.forum.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
    public static final String EXCHANGE_NAME = "topic_exchange";
    public static final String QUEUE_NAME = "topic_queue";
    public static final String UPDATE_TOPIC_QUEUE = "update_topic_queue";

    //1.交换机
    @Bean("topicExchange")
    public Exchange bootExchange(){
        //通过ExchangeBuilder类提供的静态方法创建交换机
        //.topicExchange 创建topic类型的交换机，还可以创建其他类型的交换机
        //.durable 是否持久化
        //.build() 创建对象
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }

    //2.Queue 队列
    @Bean("topicQueue")
    public Queue bootQueue(){
        //通过ExchangeBuilder类提供的静态方法创建交换机
        //.durable(String name)  创建持久化的队列，并设置队列名称;还可以创建非持久化的
        //.build() 创建队列对象
        return QueueBuilder.durable(QUEUE_NAME).build();
    }

    //3. 队列和交互机绑定关系 Binding
    /*
        1. 知道哪个队列
        2. 知道哪个交换机
        3. routing key

        @Qualifier 表示从容器中获取指定id的bean对象
        这里放到参数表示获取到的bean作为参数，这里是获取交换机和队列bean对象
     */
    @Bean
    public Binding bindQueueExchange(@Qualifier("topicQueue") Queue queue, @Qualifier("topicExchange") Exchange exchange){
        //.bind() 传队列对象
        //.to() 传交换机对象
        //.with 传绑定的路由key

        return BindingBuilder.bind(queue).to(exchange).with("").noargs();
    }

    //2.Queue 队列
    @Bean("updateTopicQueue")
    public Queue updateTopicQueue(){
        //通过ExchangeBuilder类提供的静态方法创建交换机
        //.durable(String name)  创建持久化的队列，并设置队列名称;还可以创建非持久化的
        //.build() 创建队列对象
        return QueueBuilder.durable(UPDATE_TOPIC_QUEUE).build();
    }

}
